import { observable } from 'mobx'
import { Todo } from '../models/todo'
import * as R from 'ramda'

export class TodoStore {
  @observable todos = []
  @observable isLoading = true

  constructor(public transportLayer, public authorStore) {
    // this.transportLayer.onReceiveTodoUpdate(updatedTodo => this.updateTodoFromServer(updatedTodo));
    // this.loadTodos()
  }

  loadTodos() {
    this.isLoading = true
    this.transportLayer.fetchTodos().subscribe(fetchedTodos => {
      fetchedTodos.forEach(json => this.updateTodoFromServer(json))
      this.isLoading = false
    })
  }

  updateTodoFromServer(json) {
    let res
    const idx = this.todos.findIndex(it => it.id === json.id)
    if (json.isDeleted) {
      res = R.remove(idx)(this.todos)
    } else if (idx < 0) {
      this.todos.push(new Todo(this, json.id))
      res = R.append(idx, new Todo(this, json.id))(this.todos)
    } else {
      res = R.update(idx, new Todo(this, json.id))(this.todos)
    }
    this.todos = res
  }

  createTodo() {
    const todo = new Todo(this)
    this.todos = R.append(todo)(this.todos)
    return todo
  }

  removeTodo(todo) {
    const idx = R.indexOf(todo)(this.todos)
    this.todos = R.remove(idx)(this.todos)
    todo.dispose()
  }
}
